﻿namespace Lesson_1_枚举
{
    #region 知识点一 基本概念
    //1.枚举是什么
    //枚举是一个比较特别的存在
    //它是一个被命名的整形常量的集合
    //一般用它表示 状态 类型 等等

    //2.申明枚举 和 申明枚举变量
    //注意：申明枚举 和 申明枚举变量是 俩个概念
    //申明枚举：相当于是 创建一个自定义的枚举类型
    //申明枚举变量：使用申明的自定义枚举类型 创建一个枚举变量
    #region  3.申明枚举语法
    ////枚举名 以E或者E_开头 作为我们的命名规范
    //enum E_自定义枚举名
    //{
    //    自定义枚举项名字, //枚举中包裹的 整形变量 第一个默认值是0 下面会依次累加
    //    自定义枚举名字1,//1
    //    自定义枚举名字2,//2
    //}

    //enum E_自定义枚举名
    //{
    //    自定义枚举项名字 = 5, //第一个枚举的默认值 变成了5
    //    自定义枚举项名字1,//6
    //    自定义枚举项名字2 = 100,
    //    自定义枚举项名字3,//101
    //    自定义枚举项名字4,//102
    //}
    #endregion
    #endregion

    #region 知识点二 在哪里申明枚举
    //1.namespace语句块中（常用）
    //2.class语句块中 struct语句块中
    //注意：枚举不能在函数语句块中申明！！！
    enum E_MonsterType
    {
        Normal,

        Boss,
    }

    enum E_PlayerType
    {
        Main,
        Other,
    }
    #endregion

    #region 习题
    enum E_QQType
    {
        OnLine,
        Leave,
        Busy,
        Invisible,
    }

    enum E_CafeType
    {
        /// <summary>
        /// 中杯
        /// </summary>
        M,
        /// <summary>
        /// 大杯
        /// </summary>
        B,
        /// <summary>
        /// 超大杯
        /// </summary>
        S,
    }

    enum E_Sex
    {
        Man,
        Woman,
    }

    enum E_Occupation
    {
        /// <summary>
        /// 战士
        /// </summary>
        Warrior,
        /// <summary>
        /// 猎人
        /// </summary>
        Hunter,
        /// <summary>
        /// 法师
        /// </summary>
        Master,
    }
    #endregion
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("枚举");

            #region 知识点三 枚举的使用
            //申明枚举变量
            //自定义的枚举类型 变量名 = 默认值（自定义的枚举类型.枚举项）
            E_PlayerType playerType = E_PlayerType.Main;

            if (playerType == E_PlayerType.Main)
            {
                Console.WriteLine("主玩家逻辑");
            }
            else if(playerType == E_PlayerType.Other)
            {
                Console.WriteLine("其他玩家逻辑");
            }

            //枚举和switch是天生一对
            E_MonsterType mosterType = E_MonsterType.Boss;
            switch (mosterType)
            {
                case E_MonsterType.Normal:
                    Console.WriteLine("普通怪物逻辑");
                    break;
                case E_MonsterType.Boss:
                    Console.WriteLine("BOSS逻辑");
                    break;
                default:
                    break;
            }
            #endregion

            #region 知识点四 枚举的类型转换
            // 1.枚举和int转换
            int i = (int)playerType;
            Console.WriteLine(i);
            //int 转枚举
            playerType = 0;


            //2.枚举和string相互转换
            string str = playerType.ToString();
            Console.WriteLine(str);

            //把string转换成枚举
            //Parse后 第一个参数：你要转为的是哪个枚举类型 第二个参数：用于转换的对应枚举的字符串
            //转换完毕后 是一个通用的类型 我们需要用括号强转成我们想要的目标枚举类型
            playerType = (E_PlayerType)Enum.Parse(typeof(E_PlayerType), "Other");
            Console.WriteLine(playerType);
            #endregion

            #region 知识点五 枚举的作用
            //在游戏开发中 对象很多时候 会有许多的状态
            //比如玩家 有一个动作状态 我们需要用一个变量或者标识 来表示当前玩家处于的是哪种状态
            //综合考虑 可能会使用 int 来表示他的状态
            // 1 行走 2 待机 3 跑步 4跳跃 ......等

            //枚举可以帮助我们 清晰的分清楚状态的含义
            #endregion

            #region 习题
            #region 一
            try
            {
                Console.WriteLine("请输入QQ的状态（0在线，1离开，2忙碌，3隐身）");
                int type = int.Parse(Console.ReadLine());
                E_QQType qqType = (E_QQType)type;
                Console.WriteLine(qqType);
            }
            catch
            {
                Console.WriteLine("请输入数字");

            }
            #endregion

            #region 二
            try
            {
                Console.WriteLine("请输入咖啡的种类（中杯0 大杯1 超大杯2");
                int cafeType = int.Parse(Console.ReadLine());
                E_CafeType cType = (E_CafeType)cafeType;
                switch (cType)
                {
                    case E_CafeType.M:
                        Console.WriteLine("你购买了中杯咖啡，花费35元");
                        break;
                    case E_CafeType.B:
                        Console.WriteLine("你购买了大杯咖啡，花费40元");
                        break;
                    case E_CafeType.S:
                        Console.WriteLine("你购买了超大杯咖啡，花费43元");
                        break;
                    default:
                        Console.WriteLine("请输入正确的类型");
                        break;
                }
            }
            catch
            {
                Console.WriteLine("请输入正确的类型");
            }
            #endregion

            #region 三
            try
            {
                Console.WriteLine("请输入性别（男0 女1");
                E_Sex sex = (E_Sex)int.Parse(Console.ReadLine());
                string sexStr = "";
                string atk = "";
                string def = "";
                switch (sex)
                {
                    case E_Sex.Man:
                        sexStr = "男性";
                        atk += 50;
                        def += 100;
                        break;
                    case E_Sex.Woman:
                        sexStr = "女性";
                        atk += 150;
                        def += 20;
                        break;
                }
                Console.WriteLine("请选择职业（战士0 猎人1 法师2");
                E_Occupation o = (E_Occupation)int.Parse(Console.ReadLine());
                string skill = "";
                string occupation = "";
                switch (o)
                {
                    case E_Occupation.Warrior:
                        atk += 20;
                        def += 100;
                        skill = "冲锋";
                        occupation = "战士";
                        break;
                    case E_Occupation.Hunter:
                        atk += 120;
                        def += 30;
                        skill = "假死";
                        occupation = "猎人";
                        break;
                    case E_Occupation.Master:
                        atk += 200;
                        def += 10;
                        skill = "奥术冲击";
                        occupation = "法师";
                        break;

                }
                Console.WriteLine("你选择了\"{0}{1}\",攻击力：{2},防御力{3},职业技能：{4}", sexStr, occupation, atk, def, skill);
            }
            catch
            {
                Console.WriteLine("请输入数字");
            }
            #endregion
            #endregion

        }
    }
}
